//
//  main.m
//  oc_类的创建
//
//  Created by blue on 16/4/5.
//  Copyright (c) 2016年 zzn. All rights reserved.
//

/*
  两类文件：.h   .m
   .h  头文件，定义属性、实例变量、方法
   .m  类的实现文件，实现方法
 */

/*方法名命名规则：由若干单词组成，除第一单词，其他
所有单词首字母大写  setName  setNameAge
 
 类名的命名规则，由若干单词组成，所有单词首字母大写

 实例变量命名规则：由下划线开头_name  _age
 */


/*
 oc类定义 ：.h文件
  @interface  类名:父类的名字(NSObject)
  {
      //定义属性变量／实例变量
   }
     //方法的定义
  @end
 
 */


/*定义学生类，实例变量：姓名，年龄
 
 方法名：setter：用于赋值的
    setName给name赋值
    setAge给age赋值
 
    getter：用于取值的
    方法名：用实例变量名_后的单词，
      name   age
 
 
 方法定义：
  +/-返回值 方法名:(参数类型)参数名  方法名:(参数类型)参数名  .....
 
   + :类的方法，用类名直接调用
   －：实例方法，用实例变量/对象调用
 
 
 */

#import <Foundation/Foundation.h>

//定义类：类名Student


@interface Student : NSObject{
    /*定义三个实例变量，变量名分别_name,_age
     NSString 代表字符串类， 
     NSInteger－》long
     */
    NSString *_name;
    NSString *_address;
    NSInteger _age;
}
//我们一般会给每个实例变量定义两个：
//一个方法用于给实例变量赋值setter方法，
//方法名set+（去掉下划线）实例变量名
//一个方法用于获取实例变量的值getter方法
//方法名，（去掉下划线）实例变量名

//定义setter－－－赋值
//_name赋值的方法setName,name、age,address行参名称

-(id)init;
-(void)setName:(NSString *)name;

-(void)setAge:(NSInteger)age;

-(void)setAddress:(NSString *)address;

//定义getter－－－取值
//定义方法得到_name实例变量的值的方法：
//方法名必须是：下划线之后的单词

//方法名：name,age,address
-(NSString *)name;
-(NSInteger)age;
-(NSString *)address;

+(void)testStudent;

@end


//方法实现 .m文件
//实现类中定义所有的方法
@implementation Student
-(id)init{
    self = [super init];
    return  self;
}

-(void)setName:(NSString *)name{
    _name = name;
}
-(void)setAge:(NSInteger)age{
    _age = age;
}
-(void)setAddress:(NSString *)address{
    _address = address;
}
-(NSString *)name{
    return _name;
}
-(NSInteger)age{
    return _age;
}
-(NSString *)address{
    return _address;
}
+(void)testStudent{
    NSLog(@"testStudent!!!");
}

@end



//方法调用必须在：main

/*oc方法的调用
 ＋方法  [类名  方法名:实参]
 －方法  [实例对象名  方法名:实参]
 */
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        /*生成Student类的实例变量，变量名stu
         注意：所有对象全部都是指针类型*
         alloc是NSObject类中类的方法
        作用：分配内存
         init是NSObject类中实例方法
         作用：初始化
         */
       Student *stu= [[Student alloc]
                      init];
        [stu setName:@"zhangsan"];
        [stu setAge:25];
        [stu setAddress:@"zhuzhou"];
        NSLog(@"姓名：%@\t年龄：%ld地址：%@",
               [stu name],[stu age],
              [stu address]);
    
      //输出结果：
      //姓名：zhangsan  年龄：25 地址：zhuzhouu
        
        Student *s2=[Student alloc];
        s2 =  [s2 init];
        
        [s2 setName:@"xiaowang"];
        [Student testStudent];
        
        
        
           }
    return 0;
}


/*作业：
 定义类：Book，
 1 定义三个实例变量:书名、价格、作者
 2 为每个实例变量定义：setter、getter方法：赋值和获取值的方法

 在main.m文件中调用方法：
   生成两个实例变量并赋值
 
  输出：书名：oc程序设计  价格：45  作者：杨丽
       书名：实用英语  价格：23 作业：周洋


*/